Gerade wenn man sich die Übergabe von Parametern an Funktionen anschaut, dann wird der Zusammenhang
zwischen Zeigern und Feldern ganz besonders deutlich. Man kann ganze Zeiger in C nämlich
gar nicht an Funktionen übergeben, zumindest man kann sie nicht bei Value übergeben, so wie
normale Parameter an Funktionen übergeben werden. Denn wenn man einer Funktion einen
Feldnamen als Parameter übergibt, dieser Feldname ist ein Zeiger auf den Anfang des
Feldes, dann wird genau dieser Zeiger bei Value übergeben, aber das ist ja nur der
Zeiger auf das erste Element des Feldes und die Funktion bekommt einfach eine Kopie dieses
Zeigers und bekommt damit eine Kopie auf den Anfang des Feldes. Und über ihren formalen
Parameter, diese Kopie des Zeigers, kann dann die Funktion in gleicher Weise wie der Aufrufer
auf die Feldelemente zugreifen und diese natürlich dann auch verändern. Das heißt
de facto haben wir damit einen Kolberreferenz, wenn man ein Feld übergibt und keinen Kolbervalue.
Zumindest wenn man das Feld betrachtet. Wenn man natürlich nur den Feldnamen als Zeiger
auf den Beginn des Feldes betrachtet, dann haben wir von dem natürlich einen Kolbervalue.
Bei der Deklaration des formalen Parameters in der Funktion wird die Feldgröße dann
weggelassen. Denn die Feldgröße ergibt sich automatisch durch den tatsächlichen Parameter,
also durch die Größe des Feldes, auf das der Zeiger übergeben wird. Und die Funktion kennt
die Feldgröße damit erstmal nicht. Sie können also eine Funktion, die ein Feld zum Beispiel auf
Integers erwartet, de facto unterschiedlich große Felder übergeben. Und irgendwoher muss die Funktion
natürlich dann wissen, wie groß das tatsächlich übergebene Feld ist. Und das können sie eigentlich
nur ihr mitteilen, indem sie einen weiteren Integerparameter haben, indem sie an die Funktion
eben die Feldgröße übergeben. Die einzige Art von Feldern, wo das ein bisschen anders ist,
sind Charakterfelder. Denn ein Charakterfeld enthält ja im Normalfall einen String und die
Strings, diese Zeichenketten werden per Konvention ja durch diesen Nullcharakter abgeschlossen. Und
sie können dann natürlich innerhalb der Funktion einfach so lange über das Feld drüber laufen,
bis sie diesen Nullcharakter finden. Und dann wissen sie, an dieser Stelle ist der Inhalt des
Feldes zu Ende. Das heißt nicht, dass das Feld nicht eventuell größer ist und wenn sie da was
reinschreiben wollten, dass da nicht noch weitere Bytes in diesem Feld verfügbar wären. Aber sie
können zumindest, wenn sie ein gefülltes Charakterfeld bekommen, anhand des Inhalts
rausbekommen, wie viele gültige Zeichen da drin stehen. Bei einem Integerfeld ist das natürlich
nicht so, denn wenn sie ein Integerfeld haben, es gibt keinen abschließenden Integerwert, an dem
sie erkennen können. Das ist jetzt quasi der letzte in dem Feld. Schauen wir uns jetzt mal die
Deklaration der Funktionsparameter an. Vorab vielleicht noch der Hinweis, wenn ein Feldparameter
als Konst deklariert wird, dann können die Feldelemente innerhalb der Funktion nicht verändert
werden. Das heißt also nicht, dass der Zeiger auf dem Beginn des Feldes konstant ist, sondern
dass die Werte, auf die dieser Zeiger zeigt, dass der Feld Inhalt, dass der konstant sein soll und
dass der Funktion damit verboten ist, über diesen Zeiger modifizierend auf das Feld zuzugreifen.
Ich habe jetzt hier ein paar Beispiele, wo ich Funktionsaufruf und Deklaration der formalen
Parameter eben am Beispiel eines Integerfeldes beschreibe. Wir haben also zwei Integerwerte a und b
und wir haben ein Feld der Größe von 20. Jetzt kann ich eine Funktion aufrufen, der übergebe ich
diese beiden Integerwerte a und b und diesen Zeigerfeld. Die Funktionsdeklaration dieser Funktion
func sieht jetzt so aus. Wir haben als ersten Parameter dieses P1, Integerparameter 1. Dann
haben wir dieses Feld, Integerparameter 2. Die Feldgröße lasse ich jetzt hier weg, denn ich will ja
keinen Speicherplatz anlegen dafür. Die Feldgröße ergibt sich ja aus der Größe des Feldes, das ich
hier übergeben habe, in dem Fall eben dieses 20 Integergroße Feld. Dann habe ich den Parameter 3.
Diese Funktionsdefinition könnten Sie genauso gut auch so hinschreiben, wie es hier steht.
Integer P1 und dann Integer Stern P2 und Integer P3. Integer Stern P2 ist an dieser Stelle genau
dasselbe wie das hier, denn die Funktion bekommt ja eine Kopie des Zeigers übergeben. Und nachdem
das originale Feld zwar eine Konstante war, also der Feldname Feld hier oben, das ist eine Konstante,
aber wenn von dieser Konstanten eine Kopie gezogen wird für die Funktion, für den formalen Parameter,
dann ist das tatsächlich ein variabler Zeiger. Und egal ob Sie es jetzt so hinschreiben mit Stern
Presenters
Zugänglich über
Offener Zugang
Dauer
00:13:29 Min
Aufnahmedatum
2020-05-05
Hochgeladen am
2020-05-05 15:36:39
Sprache
de-DE